package vectorindex_v2

import (
	"context"

	"github.com/cloudwego/eino/components/indexer"
	"github.com/cloudwego/eino/components/retriever"
	"github.com/cloudwego/eino/schema"
)

// VectorIndexer 是一个向量索引器接口，扩展了 indexer.Indexer
// 用于存储和检索向量文档

type VectorIndexer interface {
	indexer.Indexer
}

// VectorRetriever 是一个向量检索器接口，扩展了 retriever.Retriever
// 用于从向量数据库中检索相似文档

type VectorRetriever interface {
	retriever.Retriever
}

// IndexOption 是索引器的选项类型
type IndexOption func(*IndexOptions)

// IndexOptions 包含索引器的通用选项
type IndexOptions struct {
	// Embedding 是嵌入组件，用于生成向量
	Embedding EmbeddedEmbedder
}

// EmbeddedEmbedder 是嵌入器接口
type EmbeddedEmbedder interface {
	// EmbedStrings 将文本字符串转换为向量
	EmbedStrings(ctx context.Context, texts []string) ([][]float64, error)
}

// WithEmbedding 设置索引器的嵌入组件
func WithEmbedding(embedder EmbeddedEmbedder) IndexOption {
	return func(opts *IndexOptions) {
		opts.Embedding = embedder
	}
}

// RetrieveOption 是检索器的选项类型
type RetrieveOption func(*RetrieveOptions)

// RetrieveOptions 包含检索器的通用选项
type RetrieveOptions struct {
	// TopK 是要检索的文档数量
	TopK *int
	// Embedding 是嵌入组件，用于生成查询向量
	Embedding EmbeddedEmbedder
	// Filter 是过滤条件
	Filter map[string]interface{}
}

// WithTopK 设置检索器的 TopK 参数
func WithTopK(k int) RetrieveOption {
	return func(opts *RetrieveOptions) {
		opts.TopK = &k
	}
}

// WithRetrieveEmbedding 设置检索器的嵌入组件
func WithRetrieveEmbedding(embedder EmbeddedEmbedder) RetrieveOption {
	return func(opts *RetrieveOptions) {
		opts.Embedding = embedder
	}
}

// WithFilter 设置检索器的过滤条件
func WithFilter(filter map[string]interface{}) RetrieveOption {
	return func(opts *RetrieveOptions) {
		opts.Filter = filter
	}
}

// GetCommonOptions 获取通用索引选项
func GetCommonOptions(defaultOpts *IndexOptions, opts ...IndexOption) *IndexOptions {
	if defaultOpts == nil {
		defaultOpts = &IndexOptions{}
	}
	for _, opt := range opts {
		opt(defaultOpts)
	}
	return defaultOpts
}

// GetRetrieveCommonOptions 获取通用检索选项
func GetRetrieveCommonOptions(defaultOpts *RetrieveOptions, opts ...RetrieveOption) *RetrieveOptions {
	if defaultOpts == nil {
		defaultOpts = &RetrieveOptions{}
	}
	for _, opt := range opts {
		opt(defaultOpts)
	}
	return defaultOpts
}

// GetImplSpecificOptions 获取实现特定的选项
func GetImplSpecificOptions(defaultOpts interface{}, opts []interface{}) interface{} {
	// 这个函数将在具体实现中被重写
	return defaultOpts
}
